上一篇提到,原先使用2組[0~9]的陣列,分別去紀錄猜測數和目標答案每個數字出現的次數,用於判斷B的數量;最後還得掃完整個陣列才能判斷出B。
此處優化成只有針對目標計算數字數量,用於後續計算B。掃4次後(假設是4位數猜數字),當猜測值與目標相等,累計A的數量並扣掉目標數字數量(因為是A,就不會是B),A計算完成,其B最大值為4-A 。
接著當 (tar[i]!=guess[i]) && (guess[i]也沒有出現在目標數字裡),則B--,並把掃過的目標值對應到的出現次數-1(比對過,且B也減掉了)
細節:
let A = 0;
for (let i = 0; i<digits; i++)
{
if (guess_n[i] === tar[i])
{
A += 1;
tar_arr[Number(tar[i])] -= 1;
}
}
let B = digits-A;
for (let i = 0; i<digits; i++)
{
if (guess_n[i] !== tar[i])
{
if (tar_arr[Number(guess_n[i])] === 0)
{
B -= 1;
}
if (tar_arr[Number(guess_n[i])] > 0)
{
tar_arr[Number(guess_n[i])] -= 1;
}
}
}
ans = A + "A" + B + "B<br>";